﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Linq;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Corretagem.Presenter;

namespace Sinacor.UI.Bovespa.Corretagem.View.SmartClient
{
    public partial class TabelaPoliticaCorretagem : SinacorWindow, ICadastroCorretagem
    {
        #region Campos

        private bool _isCanceladoTabela = false;
        private bool _isCanceladoPolitica = false;
        private Model.Enum.TipoControleBeneficio _tipoControleBeneficios;
        private ValidationResult _validationResult;

        #endregion

        #region CadastroCorretagem

        /// <summary>
        /// Property com a presenter da view
        /// </summary>
        public Presenter.CadastroCorretagem Presenter { get; set; }

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor padrão da view
        /// </summary>
        public TabelaPoliticaCorretagem()
        {
            this.InitializeComponent();

            // Inicialize a presenter no construtor
            this.Presenter = new Presenter.CadastroCorretagem(this);

            // Configure a presenter no DataContext da janela (para facilitar os bindings)
            this.DataContext = this.Presenter;

            // Configurando o Type de novos itens da grid, só necessário qunado a grid permitir inclusão
            // Obs: Esta property foi configurada no Code-Behind porque quando configurada no XAML o type
            // não é encontrado.
            this.DtgTabelaCorretagem.NewItemType = typeof(Model.TabelaCorretagem);
            this.DtgPoliticaCorretagem.NewItemType = typeof(Model.PoliticaCorretagem);

            this.AfterInitialize += new RoutedEventHandler(TabelaPoliticaCorretagem_AfterInitialize);
        }

        #endregion

        #region AfterInitialize

        private void TabelaPoliticaCorretagem_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.Presenter.InicializarTabelas();
            this.Presenter.InicializarPoliticas();

            this.CmbAplicacaoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.CmbTabelaPadraoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);

            TabMain.SelectionChanged += new SelectionChangedEventHandler(TabMain_SelectionChanged);
        }

        #endregion

        #region Eventos

        #region Tab Control

        private void TabMain_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            /*if (e.AddedItems != null
                && e.AddedItems.Count > 0)
            {
                if (e.AddedItems[0] == TbiCorretagem)
                {
                    LimparCampos();
                    Presenter.InicializarTabelas();
                }
                else if (e.AddedItems[0] == TbiPoliticas)
                {
                    LimparCamposPolitica();
                    Presenter.InicializarPoliticas();

                    this.CmbAplicacaoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                    this.CmbTabelaPadraoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                }
            }*/
        }

        #endregion

        #region Tabela Corretagem

        #region Eventos da Pesquisa Tabela Corretagem

        private void RdbSomaValoresOperadorPesquisa_Checked(object sender, RoutedEventArgs e)
        {
            this.Presenter.FiltroTabela.ModoAplicacao = Model.Enum.ModoAplicacao.SomaValoresOperador;
        }

        private void RdbAssumeMaiorValorPesquisa_Checked(object sender, RoutedEventArgs e)
        {
            this.Presenter.FiltroTabela.ModoAplicacao = Model.Enum.ModoAplicacao.AssumeMaiorValor;
        }

        private void RdbAssumeMenorValorPesquisa_Checked(object sender, RoutedEventArgs e)
        {
            this.Presenter.FiltroTabela.ModoAplicacao = Model.Enum.ModoAplicacao.AssumeMenorValor;
        }

        private void RdbSimPesquisa_Checked(object sender, RoutedEventArgs e)
        {
            this.Presenter.FiltroTabela.IndicadorDescontoDiferenciado = true;
        }

        private void RdbNaoPesquisa_Checked(object sender, RoutedEventArgs e)
        {
            this.Presenter.FiltroTabela.IndicadorDescontoDiferenciado = false;
        }

        private void BtnPesquisar_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.Pesquisar();
            this.HideUserWaitingProcess();
        }

        private void BtnNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            this.LimparCampos();
        }

        #endregion

        #region Eventos da DataGrid Tabela de Corretagem

        private void menuDuplicar_Loaded(object sender, RoutedEventArgs e)
        {
            /*if (this.DtgTabelaCorretagem.SelectedItems.Count > 0)
            {
                ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
            else
            {
                ((SinacorContextMenuItem)sender).IsEnabled = false;
            }*/
            this.HabilitarMenuContextual(sender, DtgTabelaCorretagem);
        }

        private void menuDuplicar_Click(object sender, RoutedEventArgs e)
        {
            this.DuplicarTabelaCorretagem();
        }

        private void DtgTabelaCorretagem_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (e.OldCell != null)
                {
                    //Se não é a mesma linha então dispara os eventos de finalização
                    if (e.OldCell.Row.Index != e.NewCell.Row.Index && this._isCanceladoTabela == false)
                    {
                        this.DtgTabelaCorretagem.SelectItem(e.ItemInfo.Index);
                    }
                    //Mantem selecionada a nova linha clicada quando é update
                    if (this._isCanceladoTabela)
                    {
                        this.DtgTabelaCorretagem.SelectItem(e.OldCell.Row.Index);
                        this._isCanceladoTabela = false;
                    }
                }
            }
            e.Handled = true;
        }

        private void DtgTabelaCorretagem_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");
                SinacorDataGrid dtgFaixaAplicacao = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao");


                if (dtgDescontoDiferenciado.IsInserting)
                    dtgDescontoDiferenciado.EndInsert();
                else if (dtgDescontoDiferenciado.IsUpdating)
                    dtgDescontoDiferenciado.EndUpdate();

                if (dtgFaixaAplicacao.IsInserting)
                    dtgFaixaAplicacao.EndInsert();
                else if (dtgFaixaAplicacao.IsUpdating)
                    dtgFaixaAplicacao.EndUpdate();

                bool isChangingLine = this.DtgTabelaCorretagem.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        this.SalvarTabelaCorretagem(e);
                    }
                    else
                    {
                        this.DtgTabelaCorretagem.CancelInsert();
                        this.DtgTabelaCorretagem.SelectedIndex = ((System.Windows.Controls.Primitives.MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCanceladoTabela = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.SalvarTabelaCorretagem(e);
                }
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");
                SinacorDataGrid dtgFaixaAplicacao = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao");

                if (dtgDescontoDiferenciado.IsInserting)
                    dtgDescontoDiferenciado.EndInsert();
                else if (dtgDescontoDiferenciado.IsUpdating)
                    dtgDescontoDiferenciado.EndUpdate();

                if (dtgFaixaAplicacao.IsInserting)
                    dtgFaixaAplicacao.EndInsert();
                else if (dtgFaixaAplicacao.IsUpdating)
                    dtgFaixaAplicacao.EndUpdate();

                bool isChangingLine = this.DtgTabelaCorretagem.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        this.AlterarTabelaCorretagem(e);
                    }
                    else
                    {
                        this.DtgTabelaCorretagem.CancelUpdate();
                        this.DtgTabelaCorretagem.SelectedIndex = ((System.Windows.Controls.Primitives.MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCanceladoTabela = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.AlterarTabelaCorretagem(e);
                }
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                if (!this.Presenter.ExcluirTabelaCorretagem(this.DtgTabelaCorretagem.SelectedItem as Model.TabelaCorretagem))
                {
                    e.Cancel = true;
                }
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                this.LimparDataGridTabelaCorretagem();
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                this.LimparDataGridTabelaCorretagem();
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ControledeDescontosDiferenciados(false);
                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbNao").IsChecked = true;
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").IsEnabled = false;
                this.FindSinacorInt16TextBox(this.DtgTabelaCorretagem, "TxtCodigoTabela").IsEnabled = true;
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).IndicadorDescontoDiferenciado = false;
            }

            e.Handled = true;
        }

        private void DtgTabelaCorretagem_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (DtgTabelaCorretagem.IsEditing)
                {
                    this.PrepararTabelaCorretagemSelecionada();

                    if (((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).ModoAplicacao != null)
                    {
                        switch (((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).ModoAplicacao.Value)
                        {
                            case Model.Enum.ModoAplicacao.SomaValoresOperador:
                                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbSomaValoresOperador").IsChecked = true;
                                break;
                            case Model.Enum.ModoAplicacao.AssumeMaiorValor:
                                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbAssumeMaiorValor").IsChecked = true;
                                break;
                            case Model.Enum.ModoAplicacao.AssumeMenorValor:
                                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbAssumeMenorValor").IsChecked = true;
                                break;
                        }
                    }

                    this.FindSinacorInt16TextBox(this.DtgTabelaCorretagem, "TxtCodigoTabela").IsEnabled = false;
                    this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                    this.DtgTabelaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                }
            }

            e.Handled = true;
        }

        private void ControledeDescontosDiferenciados(bool show)
        {
            SinacorExpander ExpDescontosDiferenciados = (SinacorExpander)ControlHelper.FindChild(this.DtgTabelaCorretagem.GetEditRow(), "ExpDescontosDiferenciados");
            Grid GrdFaixasAplicacao = (Grid)ControlHelper.FindChild(this.DtgTabelaCorretagem.GetEditRow(), "GrdFaixasAplicacao");

            SinacorExpander ExpFaixasAplicacao = (SinacorExpander)ControlHelper.FindChild(this.DtgTabelaCorretagem.GetEditRow(), "ExpFaixasAplicacao");
            SinacorDataGrid DtgFaixaAplicacao = (SinacorDataGrid)ControlHelper.FindChild(this.DtgTabelaCorretagem.GetEditRow(), "DtgFaixaAplicacao");
            
            if (show)
            {
                ExpDescontosDiferenciados.Visibility = Visibility.Visible;
                ExpFaixasAplicacao.Width = 548;
                GrdFaixasAplicacao.Width = 523;
                this.GrpAplicacao.Width = 523;
                DtgFaixaAplicacao.Width = 523;
                Grid.SetColumnSpan(ExpDescontosDiferenciados, 1);
                Grid.SetColumnSpan(ExpFaixasAplicacao, 1);
                Grid.SetColumn(ExpDescontosDiferenciados, 0);
                Grid.SetColumn(ExpFaixasAplicacao, 1);
            }
            else
            {
                ExpFaixasAplicacao.Width = double.NaN;
                GrdFaixasAplicacao.Width = double.NaN;
                this.GrpAplicacao.Width = 746;
                DtgFaixaAplicacao.Width = 746;
                ExpDescontosDiferenciados.Visibility = Visibility.Hidden;
                Grid.SetColumnSpan(ExpFaixasAplicacao, 2);
                Grid.SetColumn(ExpDescontosDiferenciados, 1);
                Grid.SetColumn(ExpFaixasAplicacao, 0);
            }
        }

        private void RdbSim_Checked(object sender, RoutedEventArgs e)
        {
            ControledeDescontosDiferenciados(true);

            SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");

            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).IndicadorDescontoDiferenciado = true;

            if (this.DtgTabelaCorretagem.IsInserting)
            {
                if (dtgDescontoDiferenciado.Items.Count == 0)
                {
                    dtgDescontoDiferenciado.IsEnabled = true;

                    int? codigo = ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Codigo;
                    this.PrepararDataGridDescontoDiferenciado(codigo);
                }
            }
            else
            {
                if (dtgDescontoDiferenciado.Items.Count == 0)
                {
                    this.PrepararTabelaCorretagemSelecionada();
                }
            }

            dtgDescontoDiferenciado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        private void RdbNao_Checked(object sender, RoutedEventArgs e)
        {
            ControledeDescontosDiferenciados(false);

            if (!this.Presenter.VerificarDescontoDiferenciadoDesabilitado(this.DtgTabelaCorretagem.EditItem as Model.TabelaCorretagem))
            {
                SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");
                dtgDescontoDiferenciado.CancelUpdate();
                dtgDescontoDiferenciado.IsEnabled = false;

                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos.Clear();

                dtgDescontoDiferenciado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).IndicadorDescontoDiferenciado = false;
            }
            else
            {
                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbSim").IsChecked = true;
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).IndicadorDescontoDiferenciado = true;
            }
        }

        private void BtnSalvar_Click(object sender, RoutedEventArgs e)
        {
            if (this.DtgTabelaCorretagem.IsInserting)
            {
                this.DtgTabelaCorretagem.EndInsert();
            }
            else if (this.DtgTabelaCorretagem.IsUpdating)
            {
                this.DtgTabelaCorretagem.EndUpdate();
            }
        }

        private void BtnCancelar_Click(object sender, RoutedEventArgs e)
        {
            if (this.DtgTabelaCorretagem.IsInserting)
            {
                this.DtgTabelaCorretagem.CancelInsert();
            }
            else if (this.DtgTabelaCorretagem.IsUpdating)
            {
                this.DtgTabelaCorretagem.CancelUpdate();
            }
        }

        #endregion

        #region Eventos da DataGrid Tabela de Descontos Diferenciados

        private void DtgDescontoDiferenciado_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.HabilitarPercentual();
            }

            e.Handled = true;
        }

        private void DtgDescontoDiferenciado_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }

            e.Handled = true;
        }

        private void DtgDescontoDiferenciado_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (this.Presenter.VerificarPercentualObrigatorio(this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").EditItem as Model.DescontoDiferenciado))
                {
                    if (!((Model.DescontoDiferenciado)this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").EditItem).Percentual.HasValue && this.FindSinacorCheckBox(this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado"), "ChkUso").IsChecked.Value)
                    {
                        this.InformarPercentualObrigatorio();
                    }
                }
            }

            e.Handled = true;
        }

        private void DtgDescontoDiferenciado_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            e.Handled = true;
        }

        private void ChkUso_Click(object sender, RoutedEventArgs e)
        {
            this.HabilitarPercentual();
        }

        #endregion

        #region Eventos da DataGrid Faixa Aplicacao

        private void DtgFaixaAplicacao_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.FindSinacorComboBox(this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao"), "CmbTipoAplic").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            }

            e.Handled = true;
        }

        private void DtgFaixaAplicacao_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }

            e.Handled = true;
        }

        private void DtgFaixaAplicacao_EndingInsert(object sender, CancelItemEventArgs e)
        {
            e.Handled = true;
        }

        private void DtgFaixaAplicacao_Deleting(object sender, CancelItemsEventArgs e)
        {
            e.Handled = true;
        }

        private void DtgFaixaAplicacao_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            e.Handled = true;
        }

        private void CmbTipoAplic_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Model.TipoAplicacaoCorretagem item = (Model.TipoAplicacaoCorretagem)((SinacorComboBox)sender).SelectedItem;

            if (item != null)
            {
                SinacorDecimalTextBox txtPorcAliquota = this.FindSinacorDecimalTextBox(this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao"), "TxtPorcAliquota");

                switch (item.TipoBaseCalculo.Value)
                {
                    case Model.Enum.TipoBaseCalculo.Valores:
                        txtPorcAliquota.IsEnabled = true;
                        txtPorcAliquota.IsRequired = true;
                        break;
                    case Model.Enum.TipoBaseCalculo.Quantidade:
                        txtPorcAliquota.Value = null;
                        txtPorcAliquota.IsRequired = false;
                        txtPorcAliquota.IsEnabled = false;
                        break;
                }
            }
        }

        private void RdbSomaValoresOperador_Checked(object sender, RoutedEventArgs e)
        {
            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).ModoAplicacao = Model.Enum.ModoAplicacao.SomaValoresOperador;
        }

        private void RdbAssumeMaiorValor_Checked(object sender, RoutedEventArgs e)
        {
            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).ModoAplicacao = Model.Enum.ModoAplicacao.AssumeMaiorValor;
        }

        private void RdbAssumeMenorValor_Checked(object sender, RoutedEventArgs e)
        {
            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).ModoAplicacao = Model.Enum.ModoAplicacao.AssumeMenorValor;
        }

        #endregion

        #endregion

        #region Politica Corretagem

        #region Eventos da Pesquisa Politica corretagem

        private void BtnPesquisarPolitica_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.PesquisarPolitica();
            this.HideUserWaitingProcess();
        }

        private void BtnNovaPesquisaPolitica_Click(object sender, RoutedEventArgs e)
        {
            this.LimparCamposPolitica();
        }

        #endregion

        #region Eventos da DataGrid Politica Corretagem

        private void MenuDuplicarPoliticaCorretagem_Click(object sender, RoutedEventArgs e)
        {
            this.DuplicarPoliticaCorretagem();
        }

        private void MenuDuplicarPoliticaCorretagem_Loaded(object sender, RoutedEventArgs e)
        {
            /*if (this.DtgPoliticaCorretagem.SelectedItems.Count > 0)
            {
                ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
            else
            {
                ((SinacorContextMenuItem)sender).IsEnabled = false;
            }*/
            this.HabilitarMenuContextual(sender, DtgPoliticaCorretagem);
        }

        private void menuConsultarPolitica_Loaded(object sender, RoutedEventArgs e)
        {
            this.HabilitarMenuContextual(sender, DtgTabelaCorretagem);
        }

        private void menuConsultarPolitica_Click(object sender, RoutedEventArgs e)
        {
            if (this.DtgTabelaCorretagem.SelectedItem != null)
            {
                this.LimparCamposPolitica();

                CmbTabelaPadraoPolitica.SelectedValue = (this.DtgTabelaCorretagem.SelectedItem as Model.TabelaCorretagem).Codigo.Value;
                TbiPoliticas.Focus();
                this.PesquisarPolitica();
            }
        }

        private void menuConsultarTabela_Loaded(object sender, RoutedEventArgs e)
        {
            this.HabilitarMenuContextual(sender, DtgPoliticaCorretagem);
        }

        private void menuConsultarTabela_Click(object sender, RoutedEventArgs e)
        {
            if (this.DtgPoliticaCorretagem.SelectedItem != null)
            {
                if ((this.DtgPoliticaCorretagem.SelectedItem as Model.PoliticaCorretagem).TabelaPadrao != null &&
                    (this.DtgPoliticaCorretagem.SelectedItem as Model.PoliticaCorretagem).TabelaPadrao.Codigo != null)
                {
                    this.LimparCampos();
                    TxtCodigoTabela.Value = (Int16)(this.DtgPoliticaCorretagem.SelectedItem as Model.PoliticaCorretagem).TabelaPadrao.Codigo.Value;
                    TbiCorretagem.Focus();
                    this.Pesquisar();
                }                
            }
        }

        private void HabilitarMenuContextual(object sender, SinacorDataGrid tabela)
        {
            if (tabela.SelectedItems.Count > 0)
            {
                ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
            else
            {
                ((SinacorContextMenuItem)sender).IsEnabled = false;
            }
        }

        private void EsconderGridPolitica()
        {
            Grid GridOpcoes = (Grid)ControlHelper.FindChild(this.ExpPoliticas, "GrdOpcoes");
            GridOpcoes.Visibility = Visibility.Hidden;
            GridOpcoes.Height = 1;
        }

        private void MostrarGridVerificacoes()
        {
            Grid GridOpcoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdOpcoes");
            Grid GrdBeneficio = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdBeneficio");
            Grid GrdVerificacoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdVerificacoes");

            SinacorExpander ExpVerificacoes = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpVerificacoes");
            SinacorExpander ExpControledeBeneficios = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpControledeBeneficios");

            GridOpcoes.Visibility = Visibility.Visible;
            ExpControledeBeneficios.Visibility = Visibility.Hidden;
            ExpVerificacoes.Visibility = Visibility.Visible;
            
            Grid.SetColumnSpan(ExpVerificacoes, 2);
            Grid.SetColumn(ExpVerificacoes, 0);
            Grid.SetColumn(ExpControledeBeneficios, 1);

            GridOpcoes.Height = 300;
            GridOpcoes.Width = 875;
            ExpVerificacoes.Width = 875;
            GrdVerificacoes.Width = 850;
            GrdVerificacoes.Height = 245;
        }

        private void MostrarGridBeneficios()
        {
            Grid GrdOpcoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdOpcoes");
            Grid GrdBeneficio = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdBeneficio");
            Grid GrdVerificacoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdVerificacoes");

            SinacorExpander ExpVerificacoes = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpVerificacoes");
            SinacorExpander ExpControledeBeneficios = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpControledeBeneficios");

            GrdOpcoes.Visibility = Visibility.Visible;
            ExpControledeBeneficios.Visibility = Visibility.Visible;
            ExpVerificacoes.Visibility = Visibility.Hidden;

            Grid.SetColumnSpan(ExpControledeBeneficios, 2);
            Grid.SetColumn(ExpControledeBeneficios, 0);
            Grid.SetColumn(ExpVerificacoes, 1);
            
            GrdOpcoes.Height = 300;
            GrdOpcoes.Width = 875;
            ExpControledeBeneficios.Width = 875;
            GrdBeneficio.Width = 850;
            GrdBeneficio.Height = 245;
        }

        private void MostrarGridsBeneficioseVerificacoes()
        {
            Grid GrdOpcoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdOpcoes");
            Grid GrdBeneficio = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdBeneficio");
            Grid GrdVerificacoes = (Grid)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "GrdVerificacoes");

            SinacorExpander ExpVerificacoes = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpVerificacoes");
            SinacorExpander ExpControledeBeneficios = (SinacorExpander)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "ExpControledeBeneficios");

            GrdOpcoes.Visibility = Visibility.Visible;
            ExpControledeBeneficios.Visibility = Visibility.Visible;
            ExpVerificacoes.Visibility = Visibility.Visible;

            Grid.SetColumnSpan(ExpControledeBeneficios, 1);
            Grid.SetColumnSpan(ExpVerificacoes, 1);
            Grid.SetColumn(ExpControledeBeneficios, 0);
            Grid.SetColumn(ExpVerificacoes, 1);
            
            GrdOpcoes.Height = 300;
            GrdOpcoes.Width = 875;
            ExpControledeBeneficios.Width = 420;
            ExpVerificacoes.Width = 450;
            GrdBeneficio.Width = 395;
            GrdVerificacoes.Width = 425;
            GrdBeneficio.Height = 245;
            GrdVerificacoes.Height = 245;
        }

        private void RdbNaoSelecionado_Click(object sender, RoutedEventArgs e)
        {
            SinacorRadioButton RdbNaoSelecionado = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoSelecionado");
            SinacorRadioButton RdbNaoPoliticaCorretagem = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoPoliticaCorretagem");

            if (!this.Presenter.VerificarControleBeneficiosDesabilitado(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem))
            {
                if (RdbNaoSelecionado.IsChecked == true && RdbNaoPoliticaCorretagem.IsChecked == true)
                    EsconderGridPolitica();
                else if (RdbNaoSelecionado.IsChecked == true)
                    MostrarGridVerificacoes();

                SinacorDataGrid dtgTabelaBeneficios = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios");
                dtgTabelaBeneficios.CancelUpdate();
                dtgTabelaBeneficios.IsEnabled = false;

                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Beneficios.Clear();

                dtgTabelaBeneficios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoControleBeneficio = Model.Enum.TipoControleBeneficio.Nao;
            }
            else
            {
                switch (this._tipoControleBeneficios)
                {
                    case Model.Enum.TipoControleBeneficio.SimE:
                        ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoControleBeneficio = Model.Enum.TipoControleBeneficio.SimE;
                        this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbTodosSelecionados").IsChecked = true;
                        break;
                    case Model.Enum.TipoControleBeneficio.SimOU:
                        ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoControleBeneficio = Model.Enum.TipoControleBeneficio.SimOU;
                        this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbUmSelecionados").IsChecked = true;
                        break;
                }
            }
        }

        private void RdbUmSelecionados_Click(object sender, RoutedEventArgs e)
        {
            this._tipoControleBeneficios = Model.Enum.TipoControleBeneficio.SimOU;

            this.ControleBeneficiosSelecionado(Model.Enum.TipoControleBeneficio.SimOU);
            SinacorRadioButton RdbUmSelecionado = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbUmSelecionados");
            SinacorRadioButton RdbNaoPoliticaCorretagem = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoPoliticaCorretagem");
            if (RdbUmSelecionado.IsChecked == true && RdbNaoPoliticaCorretagem.IsChecked == true)
            {
                MostrarGridBeneficios();
            }
            else
            {
                MostrarGridsBeneficioseVerificacoes();
            }
        }

        private void RdbTodosSelecionados_Click(object sender, RoutedEventArgs e)
        {
            this._tipoControleBeneficios = Model.Enum.TipoControleBeneficio.SimE;

            this.ControleBeneficiosSelecionado(Model.Enum.TipoControleBeneficio.SimE);

            SinacorRadioButton RdbTodosSelecionados = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbTodosSelecionados");
            SinacorRadioButton RdbNaoPoliticaCorretagem = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoPoliticaCorretagem");
            if (RdbTodosSelecionados.IsChecked == true && RdbNaoPoliticaCorretagem.IsChecked == true)
            {
                MostrarGridBeneficios();
            }
            else
            {
                MostrarGridsBeneficioseVerificacoes();
            }
        }

        private void RdbNaoPoliticaCorretagem_Checked(object sender, RoutedEventArgs e)
        {

            SinacorRadioButton RdbNaoSelecionado = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoSelecionado");
            SinacorRadioButton RdbNaoPoliticaCorretagem = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoPoliticaCorretagem");
            if (RdbNaoSelecionado.IsChecked == true && RdbNaoPoliticaCorretagem.IsChecked == true)
            {
                EsconderGridPolitica();
            }
            else if (RdbNaoPoliticaCorretagem.IsChecked == true)
            {
                MostrarGridBeneficios();
            }

            
            SinacorDataGrid dtgVerificacoes = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes");
            bool succesfulSave = true;

            if (dtgVerificacoes.IsInserting)
            {
                succesfulSave = dtgVerificacoes.EndInsert();
            }
            else if (dtgVerificacoes.IsUpdating)
            {
                succesfulSave = dtgVerificacoes.EndUpdate();
            }

            if (succesfulSave && !this.Presenter.VerificarVerificacoesPoliticaDesabilitado(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem))
            {
                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).EfetuarVerificacao = false;
                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Verificacoes.Clear();

                dtgVerificacoes.IsEnabled = false;
                dtgVerificacoes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }
            else
            {
                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbSimPoliticaCorretagem").IsChecked = true;
                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).EfetuarVerificacao = true;
            }
        }

        private void RdbSimPoliticaCorretagem_Checked(object sender, RoutedEventArgs e)
        {

            SinacorRadioButton RdbNaoSelecionado = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbNaoSelecionado");
            SinacorRadioButton RdbSimPoliticaCorretagem = (SinacorRadioButton)ControlHelper.FindChild(this.DtgPoliticaCorretagem.GetEditRow(), "RdbSimPoliticaCorretagem");
            if (RdbNaoSelecionado.IsChecked == true && RdbSimPoliticaCorretagem.IsChecked == true)
            {
                MostrarGridVerificacoes();
            }
            else
            {
                MostrarGridsBeneficioseVerificacoes();
            }
            
            
            ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).EfetuarVerificacao = true;
            SinacorDataGrid dtgVerificacoes = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes");
            dtgVerificacoes.IsEnabled = true;
            dtgVerificacoes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        private void DtgPoliticaCorretagem_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbAplicacao").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaPadrao").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaBeneficios").UpdateTarget(SinacorComboBox.ItemsSourceProperty);

                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbNaoSelecionado").IsChecked = true;
                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbNaoPoliticaCorretagem").IsChecked = true;

                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").IsEnabled = false;
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").IsEnabled = false;

                //this.FindSinacorInt16TextBox(this.DtgPoliticaCorretagem, "TxtCodigoPolitica").IsEnabled = true;
                this.FindSinacorInt16TextBox(this.DtgPoliticaCorretagem, "TxtCodigoPolitica").Value = (short?)this.Presenter.SugerirProximaPolitica();

                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").Value = Convert.ToDateTime(DateTime.Now.AddDays(1).ToShortDateString());
                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataFinal").ClearValue(SinacorDatePicker.ValueProperty);
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                bool isChangingLine = this.DtgPoliticaCorretagem.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        this.SalvarPoliticaCorretagem(e);
                    }
                    else
                    {
                        this.DtgPoliticaCorretagem.CancelInsert();
                        this.DtgPoliticaCorretagem.SelectedIndex = ((System.Windows.Controls.Primitives.MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCanceladoPolitica = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.SalvarPoliticaCorretagem(e);
                }
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                this.LimparDataGridPoliticaCorretagem();
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_BeingUpdated(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (!this.Presenter.VerificarEdicaoPolitica(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem))
                {
                    e.Cancel = true;
                }
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbAplicacao").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaPadrao").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaBeneficios").UpdateTarget(SinacorComboBox.ItemsSourceProperty);

                this.PrepararPoliticaCorretagemSelecionada();

                this.FindSinacorInt16TextBox(this.DtgPoliticaCorretagem, "TxtCodigoPolitica").IsEnabled = false;
                this.FindSinacorInt16TextBox(this.DtgPoliticaCorretagem, "TxtCodigoPolitica").IsRequired = false;

                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").IsEnabled = false;
                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").IsRequired = false;

                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").Value = ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).DataInicial;
                this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataFinal").Value = ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).DataFinal;

                this.DtgPoliticaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbAplicacao").SelectedValue = (((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoAplicacao != null ? ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoAplicacao.Codigo : 0);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaPadrao").SelectedValue = (((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TabelaPadrao != null ? ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TabelaPadrao.Codigo : 0);
                this.FindSinacorComboBox(this.DtgPoliticaCorretagem, "CmbTabelaBeneficios").SelectedValue = (((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TabelaBeneficio != null ? ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TabelaBeneficio.Codigo : 0);
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                bool isChangingLine = this.DtgPoliticaCorretagem.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        this.AlterarPoliticaCorretagem(e);
                    }
                    else
                    {
                        this.DtgPoliticaCorretagem.CancelUpdate();
                        this.DtgPoliticaCorretagem.SelectedIndex = ((System.Windows.Controls.Primitives.MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCanceladoPolitica = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.AlterarPoliticaCorretagem(e);
                }
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                this.LimparDataGridPoliticaCorretagem();
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (!this.Presenter.ExcluirPoliticaCorretagem(this.DtgPoliticaCorretagem.SelectedItem as Model.PoliticaCorretagem))
                {
                    e.Cancel = true;
                }
            }

            e.Handled = true;
        }

        private void DtgPoliticaCorretagem_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (e.OldCell != null)
                {
                    //Se não é a mesma linha então dispara os eventos de finalização
                    if (e.OldCell.Row.Index != e.NewCell.Row.Index && this._isCanceladoPolitica == false)
                    {
                        this.DtgPoliticaCorretagem.SelectItem(e.ItemInfo.Index);
                    }
                    //Mantem selecionada a nova linha clicada quando é update
                    if (this._isCanceladoPolitica)
                    {
                        this.DtgPoliticaCorretagem.SelectItem(e.OldCell.Row.Index);
                        this._isCanceladoPolitica = false;
                    }
                }
            }
            e.Handled = true;
        }

        private void BtnSalvarPoliticaCorretagem_Click(object sender, RoutedEventArgs e)
        {
            SinacorDataGrid dtgVerificacoes = FindSinacorDataGrid(DtgPoliticaCorretagem, "DtgVerificacoes");
            bool retVerificacoes = true;
            if (dtgVerificacoes.IsInserting)
                retVerificacoes = dtgVerificacoes.EndInsert();
            else if (dtgVerificacoes.IsUpdating)
                retVerificacoes = dtgVerificacoes.EndUpdate();

            if (retVerificacoes == true)
            {
                SinacorDataGrid DtgTabelaBeneficios = FindSinacorDataGrid(DtgPoliticaCorretagem, "DtgTabelaBeneficios");
                if (DtgTabelaBeneficios.IsInserting)
                    DtgTabelaBeneficios.EndInsert();
                else if (DtgTabelaBeneficios.IsUpdating)
                    DtgTabelaBeneficios.EndUpdate();


                if (this.DtgPoliticaCorretagem.IsInserting)
                {
                    this.DtgPoliticaCorretagem.EndInsert();
                }
                else if (this.DtgPoliticaCorretagem.IsUpdating)
                {
                    this.DtgPoliticaCorretagem.EndUpdate();
                }
            }
        }

        private void BtnCancelarPoliticaCorretagem_Click(object sender, RoutedEventArgs e)
        {
            if (this.DtgPoliticaCorretagem.IsInserting)
            {
                this.DtgPoliticaCorretagem.CancelInsert();
            }
            else if (this.DtgPoliticaCorretagem.IsUpdating)
            {
                this.DtgPoliticaCorretagem.CancelUpdate();
            }
        }

        #endregion

        #region Eventos da DataGrid Controle Benefícios

        private void ChkSelecao_Click(object sender, RoutedEventArgs e)
        {
            this.HabilitarQuantidade();
        }

        private void DtgTabelaBeneficios_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.HabilitarQuantidade();
            }

            e.Handled = true;
        }

        private void DtgTabelaBeneficios_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }

            e.Handled = true;
        }

        private void DtgTabelaBeneficios_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (this.Presenter.VerificarValorQuantidade(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").EditItem as Model.ControleBeneficio))
                {
                    if (!((Model.ControleBeneficio)this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").EditItem).ValorQuantidade.HasValue && this.FindSinacorCheckBox(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios"), "ChkSelecao").IsChecked.Value)
                    {
                        this.InformarPreenchimentoQuantidadeValor();
                    }
                }
            }

            e.Handled = true;
        }

        private void DtgTabelaBeneficios_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            e.Handled = true;
        }

        #endregion

        #region Eventos da DataGrid Verificacao Politica

        private void DtgVerificacoes_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.Presenter.CarregarEnums();

                //As models dos combos abaixo são carregadas no método this.Presenter.InicializarPoliticas();
                this.FindSinacorComboBox(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes"), "CmbNatOper").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes"), "CmbMercado").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes"), "CmbTabela").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
                this.FindSinacorComboBox(this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes"), "CmbTabBenef").UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            }

            e.Handled = true;
        }

        private void DtgVerificacoes_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }

            e.Handled = true;
        }

        private void DtgVerificacoes_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                Model.VerificacaoPolitica verificacaoPolitica = (Model.VerificacaoPolitica)((SinacorDataGrid)sender).EditItem;
                this.Presenter.AtualizarTabelasRelacionadas(verificacaoPolitica);
                if (string.IsNullOrEmpty(verificacaoPolitica.Ativo))
                {
                    if (!verificacaoPolitica.Carteira.HasValue)
                    {
                        if (!verificacaoPolitica.CodigoAgente.HasValue)
                        {
                            if (!verificacaoPolitica.CodigoAssessor.HasValue)
                            {
                                if (!verificacaoPolitica.CodigoPolitica.HasValue)
                                {
                                    if (!verificacaoPolitica.CodigoTabelaBeneficio.HasValue)
                                    {
                                        if (!verificacaoPolitica.CodigoTabelaPadrao.HasValue)
                                        {
                                            if (verificacaoPolitica.NaturezaOperacao == null)
                                            {
                                                if (verificacaoPolitica.TipoOperacao == null)
                                                {
                                                    this.ShowError("Bovespa.Corretagem.Message.InformeAlgumaCondicao");
                                                    e.Cancel = true;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            e.Handled = true;
        }

        private void DtgVerificacoes_Deleting(object sender, CancelItemsEventArgs e)
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaExclusaoVerificacaoPolitica").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result != SinacorMessageBoxResult.Yes)
            {
                e.Cancel = true;
            }

            e.Handled = true;
        }

        private void DtgVerificacoes_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            e.Handled = true;
        }

        #endregion

        #endregion

        #region Validating

        private void txtOperador_Validating(object sender, ValidatingEventArgs e)
        {
            //Atribuo um objeto válido ao result da tela, usado logo abaixo
            this._validationResult = new ValidationResult(true, null);

            //Verifica se o campo txtOperador está preenchido
            if (e.Value != null)
            {
                //Verifica se operador existe
                this.Presenter.ValidarOperador(new Model.VerificacaoPolitica() { CodigoOperador = (int?)e.Value });
            }

            //Atribuo o result do método o result da tela, atribuído por outro método caso seja falso.
            e.Result = this._validationResult;

            //Atribuo nulo ao objeto de result da tela
            this._validationResult = null;
        }

        private void txtAtivo_Validating(object sender, ValidatingEventArgs e)
        {
            this._validationResult = new ValidationResult(true, null);

            if (e.Value != null)
            {
                this.Presenter.ValidarAtivo(new Model.VerificacaoPolitica() { Ativo = e.Value.ToString() });
            }

            e.Result = this._validationResult;

            this._validationResult = null;
        }

        private void txtAgente_Validating(object sender, ValidatingEventArgs e)
        {
            this._validationResult = new ValidationResult(true, null);

            if (e.Value != null)
            {
                this.Presenter.ValidarAgente(new Model.VerificacaoPolitica() { CodigoAgente = (int?)e.Value });
            }

            e.Result = this._validationResult;

            this._validationResult = null;
        }

        private void txtAssessor_Validating(object sender, ValidatingEventArgs e)
        {
            this._validationResult = new ValidationResult(true, null);

            if (e.Value != null)
            {
                this.Presenter.ValidarAssessor(new Model.VerificacaoPolitica() { CodigoAssessor = (int?)e.Value });
            }

            e.Result = this._validationResult;

            this._validationResult = null;
        }

        #endregion

        #endregion

        #region Métodos

        #region Tabela Corretagem

        #region Métodos Auxiliares

        private SinacorDataGrid FindSinacorDataGrid(SinacorDataGrid grid, string name)
        {
            return (SinacorDataGrid)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorDatePicker FindSinacorDatePicker(SinacorDataGrid grid, string name)
        {
            return (SinacorDatePicker)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorRadioButton FindSinacorRadioButton(SinacorDataGrid grid, string name)
        {
            return (SinacorRadioButton)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorCheckBox FindSinacorCheckBox(SinacorDataGrid grid, string name)
        {
            return (SinacorCheckBox)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorInt16TextBox FindSinacorInt16TextBox(SinacorDataGrid grid, string name)
        {
            return (SinacorInt16TextBox)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorDecimalTextBox FindSinacorDecimalTextBox(SinacorDataGrid grid, string name)
        {
            return (SinacorDecimalTextBox)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        private SinacorComboBox FindSinacorComboBox(SinacorDataGrid grid, string name)
        {
            return (SinacorComboBox)ControlHelper.FindChild(grid.GetEditRow(), name);
        }

        #endregion

        #region Métodos da Pesquisa Tabela Corretagem

        private void Pesquisar()
        {
            this.Presenter.ConsultarTabelasCorretagem();
        }

        private void LimparCampos()
        {
            this.ClearServiceErrors();

            if (this.DtgTabelaCorretagem.IsUpdating)
            {
                this.DtgTabelaCorretagem.CancelUpdate();
            }
            if (this.DtgPoliticaCorretagem.IsInserting)
            {
                this.DtgPoliticaCorretagem.CancelInsert();
            }

            this.Presenter.LimparFiltroTabelas();
            this.Presenter.ListaTabelasCorretagem.Clear();

            this.TxtCodigoTabela.UpdateTarget(SinacorInt16TextBox.ValueProperty);
            this.TxtDescricao.UpdateTarget(SinacorTextBox.TextProperty);
            this.RdbSomaValoresOperadorPesquisa.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            this.RdbAssumeMaiorValorPesquisa.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            this.RdbAssumeMenorValorPesquisa.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            this.RdbSimPesquisa.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            this.RdbNaoPesquisa.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            this.DtgTabelaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

            this.RdbSomaValoresOperadorPesquisa.IsChecked = false;
            this.RdbAssumeMaiorValorPesquisa.IsChecked = false;
            this.RdbAssumeMenorValorPesquisa.IsChecked = false;
            this.RdbSimPesquisa.IsChecked = false;
            this.RdbNaoPesquisa.IsChecked = false;
        }

        #endregion

        #region Método da DataGrid Tabela de Corretagem

        private void DuplicarTabelaCorretagem()
        {
            this.ClearServiceErrors();

            this.Presenter.DuplicarTabelaCorretagem(this.DtgTabelaCorretagem.SelectedItem as Model.TabelaCorretagem);
        }

        private void LimparDataGridTabelaCorretagem()
        {
            SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");
            SinacorDataGrid dtgFaixaAplicacao = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao");

            if (dtgDescontoDiferenciado.IsUpdating)
            {
                dtgDescontoDiferenciado.CancelUpdate();
            }

            if (dtgFaixaAplicacao.IsInserting)
            {
                dtgFaixaAplicacao.CancelInsert();
            }

            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos.Clear();
            ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Faixas.Clear();
            dtgDescontoDiferenciado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            dtgFaixaAplicacao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Método para incluir Tabela de Corretagem
        /// </summary>
        private void SalvarTabelaCorretagem(CancelItemEventArgs e)
        {
            this.ClearServiceErrors();

            if (!this.Presenter.IncluirTabelaCorretagem(this.DtgTabelaCorretagem.EditItem as Model.TabelaCorretagem))
            {
                e.Cancel = true;
            }
        }

        /// <summary>
        /// Método para Alterar Tabela de corretagem
        /// </summary>
        private void AlterarTabelaCorretagem(CancelItemEventArgs e)
        {
            this.ClearServiceErrors();

            if (!this.Presenter.AlterarTabelaCorretagem(this.DtgTabelaCorretagem.EditItem as Model.TabelaCorretagem))
            {
                e.Cancel = true;
            }
            else
            {
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos.Clear();
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Faixas.Clear();
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgFaixaAplicacao").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            }
        }

        private void PrepararTabelaCorretagemSelecionada()
        {
            this.Presenter.PrepararTabelaCorretagemSelecionada(this.DtgTabelaCorretagem.EditItem as Model.TabelaCorretagem);

            foreach (Model.TabelaCorretagem item in this.Presenter.ListaTabelasCorretagem)
            {
                if (item.Codigo == ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Codigo)
                {
                    ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos = item.Descontos;
                    ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Faixas = item.Faixas;
                }
            }

            if (((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).IndicadorDescontoDiferenciado.Value)
            {
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").IsEnabled = true;
                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbSim").IsChecked = true;
            }
            else
            {
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos.Clear();
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado").IsEnabled = false;
                this.FindSinacorRadioButton(this.DtgTabelaCorretagem, "RdbNao").IsChecked = true;
            }
        }

        private void PrepararDataGridDescontoDiferenciado(int? codigoTabela)
        {
            ModelCollection<Model.DescontoDiferenciado> descontos = new ModelCollection<Model.DescontoDiferenciado>();

            foreach (Model.TipoDescontoDiferenciado item in this.Presenter.ListaTiposDescontosDiferenciados)
            {
                Model.DescontoDiferenciado desconto = new Model.DescontoDiferenciado { CodigoTabela = codigoTabela, TipoDesconto = item };

                descontos.Add(desconto);
            }

            if (descontos.Count > 0)
            {
                ((Model.TabelaCorretagem)this.DtgTabelaCorretagem.EditItem).Descontos = descontos;
            }
            else
            {
                SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.NaoExistemTiposDescontosDiferenciados").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            }
        }

        #endregion

        #region Método da Datagrid Desconto Diferenciado

        private void HabilitarPercentual()
        {
            SinacorDataGrid dtgDescontoDiferenciado = this.FindSinacorDataGrid(this.DtgTabelaCorretagem, "DtgDescontoDiferenciado");
            SinacorDecimalTextBox txtPercentual = this.FindSinacorDecimalTextBox(dtgDescontoDiferenciado, "TxtPercentual");

            if (((Model.DescontoDiferenciado)dtgDescontoDiferenciado.EditItem).Utiliza)
            {
                txtPercentual.IsEnabled = true;

                if (this.Presenter.VerificarPercentualObrigatorio(dtgDescontoDiferenciado.EditItem as Model.DescontoDiferenciado))
                {
                    txtPercentual.IsRequired = true;
                }
            }
            else
            {
                txtPercentual.Value = null;
                txtPercentual.IsRequired = false;
                txtPercentual.IsEnabled = false;
            }
        }

        #endregion

        #endregion

        #region Politica Corretagem

        #region Métodos da Pesquisa Politica Corretagem

        private void PesquisarPolitica()
        {
            if (this.VerificaDataInicialMaiorDataFinal())
            {
                this.Presenter.ConsultarPoliticasCorretagem();
            }
        }

        private bool VerificaDataInicialMaiorDataFinal()
        {
            bool isValidated = true;

            DateTime? dataInicial = this.DtpDataInicialPolitica.Value;
            DateTime? dataFinal = this.DtpDataFinalPolitica.Value;

            if (dataInicial.HasValue && dataFinal.HasValue)
            {
                if (DateTime.Compare(dataInicial.Value, dataFinal.Value) > 0)
                {
                    SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.DataInicialMaiorDataFinal").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
                    isValidated = false;
                }
            }

            return isValidated;
        }

        private void LimparCamposPolitica()
        {
            this.ClearServiceErrors();

            if (this.DtgPoliticaCorretagem.IsUpdating)
            {
                this.DtgPoliticaCorretagem.CancelUpdate();
            }
            if (this.DtgPoliticaCorretagem.IsInserting)
            {
                this.DtgPoliticaCorretagem.CancelInsert();
            }

            this.Presenter.ListaPoliticasCorretagem.Clear();

            this.Presenter.FiltroPoliticas.Codigo = null;
            this.Presenter.FiltroPoliticas.DataFinal = null;
            this.Presenter.FiltroPoliticas.DataInicial = null;
            this.Presenter.FiltroPoliticas.Descricao = string.Empty;
            this.Presenter.FiltroPoliticas.EfetuarVerificacao = null;

            this.CmbAplicacaoPolitica.SelectedItem = null;
            this.CmbTabelaPadraoPolitica.SelectedItem = null;

            this.TxtCodigoPolitica.UpdateTarget(SinacorInt16TextBox.ValueProperty);
            this.TxtDescricaoPolitica.UpdateTarget(SinacorTextBox.TextProperty);
            this.DtpDataInicialPolitica.UpdateTarget(SinacorDatePicker.ValueProperty);
            this.DtpDataFinalPolitica.UpdateTarget(SinacorDatePicker.ValueProperty);
            this.CmbAplicacaoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.CmbTabelaPadraoPolitica.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            this.DtgPoliticaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        #endregion

        #region Método da DataGrid Política Corretagem

        private void DuplicarPoliticaCorretagem()
        {
            this.ClearServiceErrors();

            this.Presenter.DuplicarPoliticaCorretagem(this.DtgPoliticaCorretagem.SelectedItem as Model.PoliticaCorretagem);
        }

        private void LimparDataGridPoliticaCorretagem()
        {
            SinacorDataGrid dtgTabelaBeneficios = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios");
            SinacorDataGrid dtgVerificacoes = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes");

            if (dtgTabelaBeneficios.IsUpdating)
            {
                dtgTabelaBeneficios.CancelUpdate();
            }

            if (dtgVerificacoes.IsInserting)
            {
                dtgVerificacoes.CancelInsert();
            }

            ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Beneficios.Clear();
            ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Verificacoes.Clear();
            dtgTabelaBeneficios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            dtgVerificacoes.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Método para incluir Tabela de Corretagem
        /// </summary>
        private void SalvarPoliticaCorretagem(CancelItemEventArgs e)
        {
            this.ClearServiceErrors();

            if (this.VerificarPoliticaCorretagem())
            {
                (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).DataInicial = this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").Value;
                (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).DataFinal = this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataFinal").Value;

                if (!this.Presenter.IncluirPoliticaCorretagem(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem))
                {
                    e.Cancel = true;
                }
            }
            else
            {
                e.Cancel = true;
            }
        }

        private bool VerificarPoliticaCorretagem()
        {
            bool isValidated = true;

            if ((this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).TipoControleBeneficio != null &&
                (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).TipoControleBeneficio != Model.Enum.TipoControleBeneficio.Nao)
            {
                if ((this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).Beneficios.ToList<Model.ControleBeneficio>().FindAll
                    (delegate(Model.ControleBeneficio desconto) { return desconto.Utiliza; }).Count == 0)
                {
                    this.ShowError("Bovespa.Corretagem.ExceptionMessage.InformeTipoBeneficioPolitica");
                    isValidated = false;
                }
            }

            if (this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbSimPoliticaCorretagem").IsChecked.Value)
            {
                if ((this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).Verificacoes != null && (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).Verificacoes.Count == 0)
                {
                    this.ShowError("Bovespa.Corretagem.ExceptionMessage.InformeCondicoesVerificacao");
                    isValidated = false;
                }
            }

            return isValidated;
        }

        /// <summary>
        /// Método para Alterar Tabela de corretagem
        /// </summary>
        private void AlterarPoliticaCorretagem(CancelItemEventArgs e)
        {
            this.ClearServiceErrors();

            if (this.VerificarPoliticaCorretagem())
            {
                (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).DataInicial = this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataInicial").Value;
                (this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem).DataFinal = this.FindSinacorDatePicker(this.DtgPoliticaCorretagem, "DtpDataFinal").Value;

                if (!this.Presenter.AlterarPoliticaCorretagem(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem))
                {
                    e.Cancel = true;
                }
                else
                {
                    ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Beneficios.Clear();
                    ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Verificacoes.Clear();
                    this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                    this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                }
            }
            else
            {
                e.Cancel = true;
            }
        }

        private void ControleBeneficiosSelecionado(Model.Enum.TipoControleBeneficio tipoControleBeneficio)
        {
            SinacorDataGrid dtgTabelaBeneficios = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios");

            dtgTabelaBeneficios.IsEnabled = true;

            int? codigo = ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Codigo;
            this.PrepararDataGridControleBeneficios(codigo);

            ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).TipoControleBeneficio = tipoControleBeneficio;
            dtgTabelaBeneficios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        private void PrepararPoliticaCorretagemSelecionada()
        {
            this.Presenter.PrepararPoliticaCorretagemSelecionada(this.DtgPoliticaCorretagem.EditItem as Model.PoliticaCorretagem);
            var editItem = (Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem;

            foreach (Model.PoliticaCorretagem item in this.Presenter.ListaPoliticasCorretagem)
            {
                if (item.Codigo == editItem.Codigo)
                {
                    editItem.Beneficios = item.Beneficios;
                    editItem.Verificacoes = item.Verificacoes;
                }
            }

            if (editItem.TipoControleBeneficio != Model.Enum.TipoControleBeneficio.Nao)
            {
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").IsEnabled = true;

                if (editItem.EfetuarVerificacao.HasValue && editItem.EfetuarVerificacao.Value)
                    MostrarGridsBeneficioseVerificacoes();
                else
                    MostrarGridBeneficios();

                switch (editItem.TipoControleBeneficio)
                {
                    case Model.Enum.TipoControleBeneficio.Nao:
                        this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbNaoSelecionado").IsChecked = true;
                        this._tipoControleBeneficios = Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoControleBeneficio.Nao;
                        break;
                    case Model.Enum.TipoControleBeneficio.SimE:
                        this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbTodosSelecionados").IsChecked = true;
                        this._tipoControleBeneficios = Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoControleBeneficio.SimE;
                        break;
                    case Model.Enum.TipoControleBeneficio.SimOU:
                        this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbUmSelecionados").IsChecked = true;
                        this._tipoControleBeneficios = Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoControleBeneficio.SimOU;
                        break;
                }
            }
            else
            {
                editItem.Beneficios.Clear();
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios").IsEnabled = false;
                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbNaoSelecionado").IsChecked = true;
            }

            if (editItem.EfetuarVerificacao.HasValue && editItem.EfetuarVerificacao.Value)
            {
                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbSimPoliticaCorretagem").IsChecked = true;
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").IsEnabled = true;
            }
            else
            {
                this.FindSinacorRadioButton(this.DtgPoliticaCorretagem, "RdbNaoPoliticaCorretagem").IsChecked = true;
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgVerificacoes").IsEnabled = false;
            }
        }

        private void PrepararDataGridControleBeneficios(int? codigoPolitica)
        {
            ModelCollection<Model.ControleBeneficio> beneficios = new ModelCollection<Model.ControleBeneficio>();

            foreach (Model.TipoBeneficio item in this.Presenter.ListaTiposBeneficios)
            {
                Model.ControleBeneficio desconto = new Model.ControleBeneficio { CodigoPolitica = codigoPolitica, TipoBeneficio = item };

                beneficios.Add(desconto);
            }

            if (beneficios.Count > 0)
            {
                ((Model.PoliticaCorretagem)this.DtgPoliticaCorretagem.EditItem).Beneficios = beneficios;
            }
            else
            {
                SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.NaoExistemTiposBeneficios").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            }
        }

        #endregion

        #region Método da Datagrid Controle Beneficios

        private void HabilitarQuantidade()
        {
            SinacorDataGrid dtgTabelaBeneficios = this.FindSinacorDataGrid(this.DtgPoliticaCorretagem, "DtgTabelaBeneficios");
            SinacorDecimalTextBox txtValorQtde = this.FindSinacorDecimalTextBox(dtgTabelaBeneficios, "TxtValorQtde");

            if (((Model.ControleBeneficio)dtgTabelaBeneficios.EditItem).Utiliza)
            {
                txtValorQtde.IsEnabled = true;
                txtValorQtde.IsRequired = true;

                if ((dtgTabelaBeneficios.EditItem as Model.ControleBeneficio).TipoBeneficio.BaseVerificacao == Model.Enum.TipoBaseVerificacao.Quantidade)
                {
                    txtValorQtde.Decimals = 0;
                }
                else
                {
                    txtValorQtde.Decimals = 2;
                }
            }
            else
            {
                txtValorQtde.Value = null;
                txtValorQtde.IsRequired = false;
                txtValorQtde.IsEnabled = false;
            }
        }

        #endregion

        #endregion

        #endregion

        #region ICadastroCorretagem Members

        #region Métodos "Tabelas Corretagem"

        public void AtualizarTabelasCorretagem()
        {
            this.DtgTabelaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public bool ConfirmarDuplicaTabelaCorretagem()
        {
            bool isDuplicated = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaDuplicarTabela").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isDuplicated = true;
            }

            return isDuplicated;
        }

        public bool ConfirmarExclusaoTabelaCorretagem()
        {
            bool isDeleted = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaExclusaoTabelaCorretagem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isDeleted = true;
            }

            return isDeleted;
        }

        public void InformarSucessoDuplicaTabelaCorretagem(int? codigoTabela)
        {
            string msg = this.FindResource("Bovespa.Corretagem.Message.TabelaDuplicadaSucesso").ToString();
            msg = String.Format(msg, codigoTabela);
            SinacorMessageBox.Show(msg, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarPercentualObrigatorio()
        {
            this.ShowError("Bovespa.Corretagem.Message.PercentualObrigatorio");
        }

        public bool ConfirmarDescarteDescontosDiferenciados()
        {
            bool isUndo = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaDescarteDescontos").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isUndo = true;
            }

            return isUndo;
        }

        #endregion

        #region Métodos "Política Corretagem"

        public void AtualizarPoliticasCorretagem()
        {
            this.DtgPoliticaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarComboTabelasCorretagem()
        {
            this.AtualizarCombo(CmbTabelaPadraoPolitica);

            if (DtgPoliticaCorretagem.IsEditing)
            {
                this.AtualizarCombo(this.FindSinacorComboBox(DtgPoliticaCorretagem, "CmbTabelaPadrao"));
                this.AtualizarCombo(this.FindSinacorComboBox(DtgPoliticaCorretagem, "CmbTabelaBeneficios"));

                var DtgVerificacoes = this.FindSinacorDataGrid(DtgPoliticaCorretagem, "DtgVerificacoes");

                for (var i = 0; i < DtgVerificacoes.Items.Count; i++)
                {
                    this.AtualizarCombo((SinacorComboBox)ControlHelper.FindChild(DtgVerificacoes.GetRow(i), "CmbTabela_Aux"));
                    this.AtualizarCombo((SinacorComboBox)ControlHelper.FindChild(DtgVerificacoes.GetRow(i), "CmbTabBenef_Aux"));
                }

                if (DtgVerificacoes.IsEditing)
                {
                    this.AtualizarCombo(this.FindSinacorComboBox(DtgVerificacoes, "CmbTabela"));
                    this.AtualizarCombo(this.FindSinacorComboBox(DtgVerificacoes, "CmbTabBenef"));
                }
            }
        }

        private void AtualizarCombo(SinacorComboBox combo)
        {
            var value = combo.SelectedValue;
            combo.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            combo.SelectedValue = value;
        }

        public bool ConfirmarDuplicaPoliticaCorretagem()
        {
            bool isDuplicated = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmarDuplicaPolitica").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isDuplicated = true;
            }

            return isDuplicated;
        }

        public bool ConfirmarExclusaoPoliticaCorretagem()
        {
            bool isDeleted = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmarExclusaoPoliticaCorretagem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isDeleted = true;
            }

            return isDeleted;
        }

        public void InformarSucessoDuplicaPolitica(int? codigoPolitica)
        {
            string msg = this.FindResource("Bovespa.Corretagem.Message.InformarSucessoDuplicaPolitica").ToString();
            msg = String.Format(msg, codigoPolitica);
            SinacorMessageBox.Show(msg, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarValorMaximoMenorValorMinimo()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.ValorMinimoMaiorValorMaximo").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        public bool ConfirmarDescarteVerificacoesPolitica()
        {
            bool isUndo = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaDescarteVerificacoesPolitica").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isUndo = true;
            }

            return isUndo;
        }

        public bool ConfirmarDescarteControlesBeneficios()
        {
            bool isUndo = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaDescarteControlesBeneficios").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isUndo = true;
            }

            return isUndo;
        }

        public void InformarPreenchimentoQuantidadeValor()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.InformarQuantidadeValor").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        public void InformarNenhumTipoBeneficioCadastrado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.InformarNenhumTipoBeneficioCadastrado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        public void InformarPoliticaNaoPodeSerEditada()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.PoliticaNaoPodeSerEditada").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        #region Comuns

        public void InformarSucessoAlteracao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.AlteracaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarSucessoExclusao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.ExclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarSucessoInclusao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.InclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarPesquisaTabelaSemResultado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.PesquisaSemResultado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            this.DtgTabelaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void InformarPesquisaPoliticaSemResultado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.PesquisaSemResultado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            this.DtgPoliticaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void InformarAgenteInvalido()
        {
            this._validationResult = new ValidationResult(false, "Bovespa.Corretagem.Message.AgenteInvalido");
        }

        public void InformarAssessorInvalido()
        {
            this._validationResult = new ValidationResult(false, "Bovespa.Corretagem.Message.AssessorInvalido");
        }

        public void InformarAtivoInvalido()
        {
            this._validationResult = new ValidationResult(false, "Bovespa.Corretagem.Message.VerificacaoPoliticaAtivoInvalido");
        }

        public void InformarOperadorInvalido()
        {
            this._validationResult = new ValidationResult(false, "Bovespa.Corretagem.Message.OperadorInvalido");
        }

        #endregion

        #endregion
    }
}
